// Let

// 用来替代 var 的

// var 有两个不足：
// 1、var出现变量提升
// 2、var没有块级作用域

// 1、let 声明的全局变量不是window的属性存在的

var a = 1;
console.log(window.a); // 1

// 请在控制台上测试
let b = 2;
console.log(window.b); // undefined

// 2、let 不允许重复声明变量

var c = 3;
// let c = 4; // Identifier 'c' has already been declared

// 3、let 声明的变量不存在变量提升

function fn1() {
    console.log(d);
    var d = 1; // undefined 此时，变量d出现了变量提升的现象
}

fn1();

// 你可以把 var d = 1 理解成下面这段代码，即先 var d ，然后 d = 1

function fn2() {
    var d;
    console.log(d); // undefined
    d = 1;
}

fn2();

// 请在控制台上测试
function fn3() {
    console.log(d); // VM3281:1 Uncaught ReferenceError: d is not defined
    let d = 1;
}

fn3();

// 结论：使用let必须先声明再使用。

// 4、let 声明的变量拥有块级作用域

{
    let h = 1;
}

// console.log(h); // let.js?5346:58 Uncaught ReferenceError: h is not defined

for(var i = 1; i <= 3; i++) {
    console.log(i); // 1 2 3
}

console.log(i); // 4

// 改成 let 会怎么样呢？

for(let j = 1; j <= 3; j++) {
    console.log(j); // 1 2 3
}

// console.log(j); // Uncaught ReferenceError: j is not defined

for(var i = 1; i <= 3; i++) {
    setTimeout(function(){
        console.log(i);
    }, 1000);
}
